package service

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"mts/log_srv/internal/domain"
	"mts/log_srv/internal/repository"
)

type LogService interface {
	HandleLog(logData map[string]interface{}) error
	List(ctx *gin.Context, page, size int) ([]*domain.Logs, error)
}

type LogServiceImp struct {
	logRepo repository.LogRepo
}

func (s *LogServiceImp) List(ctx *gin.Context, page, size int) ([]*domain.Logs, error) {
	list, err := s.logRepo.List(ctx, page, size)
	if err != nil {
		zap.S().Errorf("获取日志失败:%s", err)
	}
	return list, err
}

func NewLogService(logRepo repository.LogRepo) LogService {
	return &LogServiceImp{
		logRepo: logRepo,
	}
}

func (s *LogServiceImp) HandleLog(logData map[string]interface{}) error {
	//在生产者发送消息时，为每条消息生成一个唯一的业务标识
	//消费者端维护一个"已处理"记录表或缓存，记录已经处理过的消息 ID。
	//每次消费前先查是否已处理过该 ID，若已存在则跳过处理
	//总的来说就是对已处理的消息 做幂等性校验,防止重复写入。在这个项目中不再实现,可以作为拓展部分
	// 将 map 转换为 JSON 字节切片
	logBytes, err := json.Marshal(logData)
	if err != nil {
		zap.S().Errorf("Error encoding JSON: %v", err)
		return err
	}

	// 将 JSON 字节切片反序列化为 Log 结构体
	var log domain.Logs
	err = json.Unmarshal(logBytes, &log)
	if err != nil {
		zap.S().Errorf("Error decoding JSON: %v", err)
		return err
	}
	// 保存日志到数据库
	err = s.logRepo.SaveLog(log)
	if err != nil {
		zap.S().Errorf("Error saving log: %v", err)
		return err
	}

	return nil
}
